package com.cs.service.impl;

import com.cs.domain.CSCategory;
import com.cs.domain.vo.CategoryVO;
import com.cs.mapper.CSCategoryMapper;
import com.cs.service.ICsCategoryService;
import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 物料分类Service业务层处理
 *
 * @author ruoyi
 * @date 2024-12-21
 */
@Service
public class CsCategoryServiceImpl implements ICsCategoryService {
    @Autowired
    private CSCategoryMapper csCategoryMapper;

    /**
     * 查询物料分类
     *
     * @param cId 物料分类主键
     * @return 物料分类
     */
    @Override
    public CSCategory selectCsCategoryByCId(Long cId) {
        return csCategoryMapper.selectCsCategoryByCId(cId);
    }

    /**
     * 查询物料分类列表
     *
     * @param csCategory 物料分类
     * @return 物料分类
     */
    @Override
    public List<CSCategory> selectCsCategoryList(CSCategory csCategory) {
        return csCategoryMapper.selectCsCategoryList(csCategory);
    }

    /**
     * 新增物料分类
     *
     * @param csCategory 物料分类
     * @return 结果
     */
    @Override
    public int insertCsCategory(CSCategory csCategory) {
        Integer cId = csCategoryMapper.getMaxId();
        if (csCategory.getpId() == null || csCategory.getpId() == 0) {
            //一级分类
            if(cId!=null){
                csCategory.setcId(cId+1);
            }else{
                csCategory.setcId(1);
            }
            return csCategoryMapper.insertCsCategory(csCategory);
        }
        //不是一级分类
        //获得父级id长度
        int length = (csCategory.getpId() + "").length();
        Integer maxId = csCategoryMapper.getMaxIdByIdLength(length + 1);
        //1-999 为一级父类
        if (length <= 3) {
            //说明选中的为一级父类,也就是新增二级分类
            Integer maxIdByIdLength = csCategoryMapper.getMaxIdByIdLength(4);
            if (maxIdByIdLength != null && maxIdByIdLength != 0){
                csCategory.setcId(maxIdByIdLength + 1);
            } else{
                csCategory.setcId((int) (Math.pow(10, 3)) + 1);
            };
            return csCategoryMapper.insertCsCategory(csCategory);
        }
        //查询该位数加一位数的id最大值
        if (maxId == null || maxId == 0) {
            //说明为空,最大为1
            csCategory.setcId((int) (Math.pow(10, length)) + 1); // 生成对应长度的最小 ID
        } else {
            csCategory.setcId(maxId + 1);
        }
        //否则,这个级下已经存在id

        return csCategoryMapper.insertCsCategory(csCategory);
    }

    /**
     * 修改物料分类
     *
     * @param csCategory 物料分类
     * @return 结果
     */
    @Override
    public int updateCsCategory(CSCategory csCategory) {
        csCategory.setUpdateTime(DateUtils.getNowDate());
        if (csCategory.getpId()==null||csCategory.getpId()==0) {
            //将其变成一级菜单前判断是否有子集
            Integer countByPId = csCategoryMapper.getCountByPId(csCategory.getcId());
            if (countByPId > 0) {
                return 0; //放回不得修改
            }
            //没有子集 , 修改cId和pId
            csCategoryMapper.deleteCsCategoryByCId(Long.parseLong(csCategory.getcId()+""));
            Integer cId = csCategoryMapper.getMaxId();
            csCategory.setpId(0);
            csCategory.setcId(cId+1);
            return csCategoryMapper.insertCsCategory(csCategory);
        }
        csCategoryMapper.deleteCsCategoryByCId(Long.parseLong(csCategory.getcId()+""));
        //不是选择变成一级菜单,而是二级菜单
        int length = (csCategory.getpId() + "").length();
        Integer maxId = csCategoryMapper.getMaxIdByIdLength(length + 1);
        if (length <= 3) {
            //说明选中的为一级父类,也就是新增二级分类
            Integer maxIdByIdLength = csCategoryMapper.getMaxIdByIdLength(4);
            if (maxIdByIdLength != null && maxIdByIdLength != 0){
                csCategory.setcId(maxIdByIdLength + 1);
            } else{
                csCategory.setcId((int) (Math.pow(10, 4)) + 1);
            };

            return csCategoryMapper.insertCsCategory(csCategory);
        }
        //否则是其它的
        if (maxId == null || maxId == 0) {
            //说明为空,最大为1
            System.out.println("length = " + length);
            long i = (long) Math.pow(10, length) + 1;
            System.out.println("i = " + i);
            csCategory.setcId(Integer.parseInt(i+"")); // Ensure this conversion is safe
        } else {
            csCategory.setcId(maxId + 1);
        }
        return csCategoryMapper.insertCsCategory(csCategory);

    }

    /**
     * 批量删除物料分类
     *
     * @param cIds 需要删除的物料分类主键
     * @return 结果
     */
    @Override
    public int deleteCsCategoryByCIds(Long[] cIds) {
        return csCategoryMapper.deleteCsCategoryByCIds(cIds);
    }

    /**
     * 删除物料分类信息
     *
     * @param cId 物料分类主键
     * @return 结果
     */
    @Override
    public int deleteCsCategoryByCId(Long cId) {
        return csCategoryMapper.deleteCsCategoryByCId(cId);
    }

    @Override
    public List<CategoryVO> getLevel() {
        List<CategoryVO> items = csCategoryMapper.getLevel();

        Map<Long, CategoryVO> itemMap = items.stream()
                .peek(item -> item.setChildren(new ArrayList<>()))
                .collect(Collectors.toMap(CategoryVO::getValue, item -> item));

        // Build the hierarchy using itemMap
        List<CategoryVO> rootItems = new ArrayList<>();

        for (CategoryVO item : items) {
            if (item.getpId() == null || item.getpId() == 0) {
                rootItems.add(item);
            } else {
                CategoryVO parent = itemMap.get(item.getpId());
                if (parent != null) {
                    parent.getChildren().add(item);
                }
            }
        }
        return rootItems;
    }
}